package com.atrium.master.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.atrium.master.dao.GestorPrestamosDao;
import com.atrium.master.modelo.Prestamo;

public class GestorPrestamosDaoImpl extends JdbcDaoSupport implements
		GestorPrestamosDao {

	public Prestamo agregarPrestamo(final Prestamo prestamo) {
		final String INSERT_SQL = "INSERT INTO prestamos (idLibro,idUsuario,fechaPrestamo) values(?,?,?)";
		getJdbcTemplate().update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(
					Connection connection) throws SQLException {
				PreparedStatement ps = connection.prepareStatement(INSERT_SQL);
				ps.setInt(1, prestamo.getIdLibro());
				ps.setInt(2, prestamo.getIdUsuario());
				ps.setDate(3, prestamo.getFechaPrestamo());
				return ps;
			}
		});
		return prestamo;
	}

	public Prestamo modificarDatosPrestamo(final Prestamo prestamo) {
		final String UPDATE_SQL = "update prestamos set fechaPrestamo=? where idLibro=? and idUsuario=?";
		getJdbcTemplate().update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(
					Connection connection) throws SQLException {
				PreparedStatement ps = connection.prepareStatement(UPDATE_SQL);
				ps.setDate(1, prestamo.getFechaPrestamo());
				ps.setInt(2, prestamo.getIdLibro());
				ps.setInt(3, prestamo.getIdUsuario());
				return ps;
			}
		});
		return prestamo;
	}

	public Prestamo obtenerPrestamoPorId(Integer idLibro, Integer idUsuario) {
		final String SELECT_SQL = "select * from prestamos where idLibro=? and idUsuario=?";
		return getJdbcTemplate().queryForObject(SELECT_SQL,
				new RowMapper<Prestamo>() {
					public Prestamo mapRow(ResultSet rs, int rowNum) throws SQLException {
						return new Prestamo(
							rs.getInt("idLibro"), 
							rs.getInt("idUsuario"), 
							rs.getDate("fechaPrestamo"));
					}
				}, new Object[] { idLibro, idUsuario });
	}
	
	public List<Prestamo> obtenerListadoPrestamos() {
		final String SELECT_SQL = "select * from prestamos";
		final List<Prestamo> listado = new LinkedList<Prestamo>();
		getJdbcTemplate().query(SELECT_SQL, new RowCallbackHandler() {
			public void processRow(ResultSet rs) throws SQLException {
				Prestamo prestamo = new Prestamo(
						rs.getInt("idLibro"), 
						rs.getInt("idUsuario"), 
						rs.getDate("fechaPrestamo"));
				listado.add(prestamo);
			}
		});
		return listado;
	}

	public List<Prestamo> obtenerPrestamosUsuario(Integer idUsuario) {
		final String SELECT_SQL = "select * from prestamos where idUsuario=?";
		
		final List<Prestamo> listado = new LinkedList<Prestamo>();
		getJdbcTemplate().query(SELECT_SQL, new Object[] { idUsuario }, new RowCallbackHandler() {
			public void processRow(ResultSet rs) throws SQLException {
				Prestamo prestamo = new Prestamo(
						rs.getInt("idLibro"), 
						rs.getInt("idUsuario"), 
						rs.getDate("fechaPrestamo"));
				listado.add(prestamo);
			}
			
		});
		return listado;
	}

	public List<Prestamo> obtenerPrestamosLibro(Integer idLibro) {
		final String SELECT_SQL = "select * from prestamos where idLibro=?";
		
		final List<Prestamo> listado = new LinkedList<Prestamo>();
		getJdbcTemplate().query(SELECT_SQL, new Object[] { idLibro }, new RowCallbackHandler() {
			public void processRow(ResultSet rs) throws SQLException {
				Prestamo prestamo = new Prestamo(
						rs.getInt("idLibro"), 
						rs.getInt("idUsuario"), 
						rs.getDate("fechaPrestamo"));
				listado.add(prestamo);
			}
			
		});
		return listado;
	}
	
	public Integer borrarPrestamo(Integer idLibro, Integer idUsuario) {
		final String DELETE_SQL = "delete from prestamos where idLibro=? and idUsuario=?";
		return getJdbcTemplate().update(DELETE_SQL, new Object[] { idLibro, idUsuario });
	}
	
	public Integer borrarPrestamosLibro(Integer id) {
		final String DELETE_SQL = "delete from prestamos where idLibro=?";
		return getJdbcTemplate().update(DELETE_SQL, new Object[] { id });
	}
	
	public Integer borrarPrestamosUsuario(Integer id) {
		final String DELETE_SQL = "delete from prestamos where idUsuario=?";
		return getJdbcTemplate().update(DELETE_SQL, new Object[] { id });
	}
}
